/*
 * 
 */
package com.mpo.ejb.persistence.dao.frontend.factorydao;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;


/**
 * Clase que contiene las operaciones comunes de una entidad sobre la base de
 * datos
 * 
 * @author Jose Auquilla
 * @version 1.0
 */
public abstract class AbstractDao<T> extends DBBase {

	private Class<T> claseEntidad;

	/**
	 * Constructor por defecto que inicializa el generico con la clase concreta
	 * 
	 * @param claseEntidad
	 */
	public AbstractDao(Class<T> claseEntidad) {
		this.claseEntidad = claseEntidad;
	}

	/**
	 * Guarda un nuevo objeto en la base de datos
	 * 
	 * @param entidad
	 */
	public void guardar(T entidad) {
		em.persist(entidad);
	}

	/**
	 * Guarda o actualiza un objeto
	 * 
	 * @param entidad
	 */
	public void guardarOActualizar(T entidad) {
		em.merge(entidad);
	}

	/**
	 * Actualiza un objeto
	 * 
	 * @param entidad
	 */
	public void actualizar(T entidad) {
		em.merge(entidad);
	}

	/**
	 * Elimina un objeto de la base de datos
	 * 
	 * @param entidad
	 */
	public void eliminar(T entidad) {
		em.remove(em.merge(entidad));
	}

	/**
	 * Busca un objeto dado su llave primaria
	 * 
	 * @param id
	 * @return
	 */
	public T buscarPorId(Object id) {
		return em.find(claseEntidad, id);
	}

	/**
	 * Obtiene una lista con todos los objetos de la base de datos
	 * 
	 * @return
	 */
	public List<T> obtenerTodos() {
		CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
		CriteriaQuery<T> criteriaQuery = criteriaBuilder
				.createQuery(claseEntidad);
		criteriaQuery.select(criteriaQuery.from(claseEntidad));
		return em.createQuery(criteriaQuery).getResultList();
	}
}
